
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03_数组扩展</title>
</head>
<body>
<!-- Array.prototype.reduce(function(total,currentValue, index,arr){})
	total			必需。初始值, 或者计算结束后的返回值。
	currentValue	必需。当前元素
	currentIndex	可选。当前元素的索引
	arr				可选。当前元素所属的数组对象。
 -->
<script type="text/javascript">
	var increment=[0,1,2,3,4];
	var res=increment.reduce((preValue,curValue)=>{
		return preValue+curValue
	})
	console.log(res)//10
	
		
	//reduce的高级用法
	// （1）计算数组中每个元素出现的次数
	let names = ['peter', 'tom', 'mary', 'bob', 'tom','peter'];
	let nameNum=names.reduce((pre,cur)=>{
		if(cur in pre){
			pre[cur]++
		}else{
			pre[cur]=1
		}
		return pre
	},{})
	console.log(nameNum);//{peter: 2, tom: 2, mary: 1, bob: 1}
	
	
	// （3）将二维数组转化为一维
	let arrays = [['peter', 'tom'], ['mary', 'bob'], ['tom','peter']];	
	let newArr=arrays.reduce((pre,cur)=>{
		return [...pre,...cur]
	},[])
	console.log(newArr);//["peter", "tom", "mary", "bob", "tom", "peter"]
	
	// （3）将多维数组转化为一维
	let arrayMary = [['peter', 'tom'], ['mary', 'bob'], ['jelly',['tom','peter']]];	
	let newArrayMary=function(arrayMary){
		return arrayMary.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArrayMary(cur):cur),[])
	}
	console.log(newArrayMary(arrayMary));//["peter", "tom", "mary", "bob", "jelly", "tom", "peter"]
	
	
	// （4）、对象里的属性求和
	let obj = [
	    {
	        subject: 'math',
	        score: 10
	    },
	    {
	        subject: 'chinese',
	        score: 20
	    },
	    {
	        subject: 'english',
	        score: 30
	    }
	];
	let sum=obj.reduce((pre,cut)=>{
		return pre+cut.score
	},0)
	console.log(sum);//60
	
	console.log( [1, 2, [3, 4, 5],[6,7,[8,9]]].flat())//[1, 2, 3, 4, 5, 6, 7, Array(2)]
	
	// 将数组转化为对象
	const arr=[['key','value'],['x',50]]
	const obj=arr.reduce((pur,cur)=>{
		const [key,value]=cur
		pur[key]=value
		return pur
	},{})
	console.log(obj)

</script>
</body>

</html>